/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package controle.modelo;

import static com.sun.corba.se.impl.util.Utility.printStackTrace;
import controle.database.ConectaBanco;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import modelo.Produto;

/**
 *
 * @author Luiz Cunha
 */
public class ControleProduto
{

    ConectaBanco conn;

    public ControleProduto()
    {
        conn = new ConectaBanco();
    }

    public List<Produto> getProdutosEmFalta()
    {
        List<Produto> listProduto = new ArrayList<>();
        conn.conexao();
        try
        {
            PreparedStatement pst = conn.conn.prepareStatement("SELECT * FROM produto WHERE quantidade_em_estoque = 0");
            ResultSet resultSet = pst.executeQuery();
            while (resultSet.next())
            {
                listProduto.add(preencheProduto(resultSet));
            }
            conn.desconecta();
            return listProduto;
        }
        catch (Exception e)
        {
            printStackTrace();
            conn.desconecta();
        }
        return null;
    }

    public Produto getProdutoByDescricao(String descricao)
    {
        conn.conexao();
        try
        {
            PreparedStatement pst = conn.conn.prepareStatement("select * from produto where descricao = ?");
            pst.setString(1, descricao);
            ResultSet resultSet = pst.executeQuery();
            resultSet.next();
            Produto produtoDeRetorno = preencheProduto(resultSet);
            conn.desconecta();
            return produtoDeRetorno;
        }
        catch (Exception e)
        {
            printStackTrace();
            conn.desconecta();
        }
        return null;
    }

    public List<Produto> getProdutoDescricaoLike(String descricao)
    {
        conn.conexao();
        List<Produto> listProduto = new ArrayList<>();
        try
        {
            String sql = "select * from produto where descricao like '%X%'";
            sql = sql.replace("X", descricao);
            PreparedStatement pst = conn.conn.prepareStatement(sql);
            ResultSet resultSet = pst.executeQuery();
            while (resultSet.next())
            {
                listProduto.add(preencheProduto(resultSet));
            }
            conn.desconecta();
            return listProduto;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            conn.desconecta();
        }
        return null;
    }

    public Produto getProdutoById(Integer id)
    {
        conn.conexao();
        try
        {
            PreparedStatement pst = conn.conn.prepareStatement("select * from produto where id_produto = ?");
            pst.setInt(1, id);
            ResultSet resultSet = pst.executeQuery();
            resultSet.next();
            Produto produtoDeRetorno = preencheProduto(resultSet);
            conn.desconecta();
            return produtoDeRetorno;
        }
        catch (Exception e)
        {
            conn.desconecta();

        }
        return null;
    }

    private Produto preencheProduto(ResultSet resultSet) throws SQLException
    {
        Produto tempProd = new Produto(resultSet.getInt("id_produto"), resultSet.getString("descricao"), resultSet.getInt("quantidade_em_estoque"), resultSet.getInt("unidades_por_pacote"), resultSet.getDouble("preco_varejo"), resultSet.getDouble("preco_revenda"));
        return tempProd;
    }

    public List<Produto> getAllProdutos()
    {
        List<Produto> tempListProduto = new ArrayList<>();
        conn.conexao();
        try
        {
            PreparedStatement pst = conn.conn.prepareStatement("select * from produto");
            ResultSet resultSet = pst.executeQuery();
            while (resultSet.next())
            {
                tempListProduto.add(preencheProduto(resultSet));
            }
            conn.desconecta();
            return tempListProduto;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            conn.desconecta();
        }
        return null;

    }

    public void addProduto(Produto produto)
    {
        conn.conexao();
        try
        {
            PreparedStatement pst = conn.conn.prepareStatement("insert into produto (descricao, quantidade_em_estoque, unidades_por_pacote, preco_varejo, preco_revenda) values (?,?,?,?,?)");
            pst.setString(1, produto.getDescricao());
            pst.setInt(2, produto.getQuantidadeEmEstoque());
            pst.setInt(3, produto.getUnidadePorPacote());
            pst.setDouble(4, produto.getPrecoVarejo());
            pst.setDouble(5, produto.getPrecoRevenda());
            pst.execute();

        }
        catch (Exception e)
        {
            e.printStackTrace();
            conn.desconecta();
        }
    }

    public void deleteProduto(Produto produto)
    {
        conn.conexao();
        try
        {
            PreparedStatement pst = conn.conn.prepareStatement("delete from produto where id_produto = ?");
            pst.setInt(1, produto.getIdProduto());
            pst.execute();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            conn.desconecta();
        }
    }

    public void updateProduto(Produto produto)
    {
        conn.conexao();
        try
        {
            PreparedStatement pst = conn.conn.prepareStatement("update produto set descricao = ?, quantidade_em_estoque = ?, unidades_por_pacote = ?, preco_varejo = ?, preco_revenda = ? where id_produto = ?");
            pst.setString(1, produto.getDescricao());
            pst.setInt(2, produto.getQuantidadeEmEstoque());
            pst.setInt(3, produto.getUnidadePorPacote());
            pst.setDouble(4, produto.getPrecoVarejo());
            pst.setDouble(5, produto.getPrecoRevenda());
            pst.setInt(6, produto.getIdProduto());
            pst.execute();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            conn.desconecta();
        }
    }
}
